package com.kaola.kaistory.mod.db;

import java.sql.ResultSet;
import java.util.List;
import java.util.Map;

import android.R.bool;
/**
 * @author Benjamin
 * 数据库管理类
 * */
public interface DbMgr {
	/**
	 * 根据对象来创建数据库(sqlite数据库)表，此表不会涉及外键等内容，是最简化的一个表格
	 * @param tableObj 要创建类对应的表的类
	 * @return {@link Boolean} 表创建的结果
	 * 例如： 传入的对象是
	 * 	class user{
	 * 		private int id;
	 * 		private String name;
	 * 		private int age;
	 * 	}
	 * 	被创建的表格将会是:
	 * create table[user](
	 * 	int [id],
	 * 	char(100) [name],
	 * 	int [age]
	 * 	)
	 * */
	public void create(Class tableObj);
	/**
	 * 自己书写sql语句进行数据库表的创建
	 * @param sql语句
	 * @return {@link Boolean} 表创建的结果
	 * */
	public void create(String sql);
	/**
	 * 更新表内容
	 * @param data 要更新的表的数据
	 * @param sets 要设置的列 当sets为null或者长度为0时不更新
	 * @param wheres 条件 当wheres为null或者长度为0时更新所有
	 * return 返回受影响的行数
	 * 例如:
	 *  data 是 user对象的值 id = 2,name ="testName",age = 18
	 *  sets 的值是[name]
	 *  wheres的值是 [id] 
	 * 	得到的的sql语句就是
	 * 	update table [user] set name = 'testName' where id = 2;
	 * */
	public int update(Object data,List<String> sets,Map<String,String> wheres);
	/**
	 * 当直接写sql语句进行 删除 更新的时候使用这个接口
	 * @param sql sql语句
	 * @return 返回受影响的行数
	 * */
	public int update(String sql);
	/**
	 * 两表连接查询
	 * @param data 要查询的表及数据
	 * @param obj 被连接查询的表
	 * @param selects 要查询的列
	 * @param where 连接的列，如果key对应的value为"SQL_ND"，key对应的值为data中的值
	 * @return {@link ResultSet}返回的结果集
	 * */
	public ResultSet selectResultSet(Object data,Object obj,List<String> selects,Map<String,String> where);
	/**
	 * 两表连接查询
	 * @param data 要查询的表及数据
	 * @param obj 被连接查询的表
	 * @param selects 要查询的列
	 * @param where 查找条件如果为null或者长度为0则无条件查询,连接的列，如果key对应的value为"SQL_ND"，key对应的值为data中的值
	 * @return {@link List}返回要查询的对象列表
	 * */
	public <T> List<T> select(T data,Object obj,List<String> selects,Map<String,String> where);
	/**
	 * 执行简单的查询，不支持多表连接查询
	 * @param data要查找的表及数据
	 * @param selects 要获取的行 如果为null或者长度为0则获取所有的列
	 * @param wheres 查找条件如果为null或者长度为0则无条件查询
	 * @return  {@link ResultSet}返回的结果集
	 * */

	public <T> List<T> select(T data,List<String> selects,Map<String,String> wheres);
	/**
	 * 自定义sql查询
	 * @param sql 自定义的查询语句
	 * @return {@link ResultSet}返回的结果集
	 * */
	public ResultSet select(String sql);
	/**
	 * 插入数据
	 * @param obj 把整个对象的所有数据插入到对应的表
	 * @return 执行结果
	 * */
	public boolean insert(Object obj);
	/**
	 * 删除数据
	 * @param obj 删除数据的表，以及删除此表需要的数据
	 * @param wheres 删除的条件
	 * @return 是否删除成功
	 * */
	public boolean delete(Object obj,Map<String,String> wheres);
	
	/**
	 * 删除表
	 * @param obj 要删除的表
	 * */
	public boolean drop(Class obj);
	/**
	 * 为避免诸如 user order 这样的表名与列名与系统关键字冲突需要在表列名之前之后添加的特殊字符 如：sql server的“[”和“]”
	 * mysql 中的 “`”（在全键盘的数字1前面esc下面那个）
	 * */
	public String getSpacialStartChar();
	/**
	 * 为避免诸如 user order 这样的表名与列名与系统关键字冲突需要在表列名之前之后添加的特殊字符 如：sql server的“[”和“]”
	 * mysql 中的 “`”（在全键盘的数字1前面esc下面那个）
	 * */
	public String getSpacialEndChar();
}
